Deprecated(2017.03.30)
对于Unidirectional Path Tracing的理解是建立在Path Tracing之上
本文用于记录当前阶段对于Path Tracing的理解。此笔记的问题来源于,对于Path Tracing使用Direct Lighting的疑惑。
很多教材上提到了渲染方程
Lo(p,wo=Le(p,wo)+∫2πfr(p,wi,wo)Li(p,wi)cosθidωi
然后紧接着说到,我们将此方程改写成直接光照部分和间接光照部分,比如Advanced Global Illumination,问题出在,当真正遇到代码实现的时候,压根找不到间接光的部分,不论是BDPT还是PT都无法直观的理解到间接光的部分。或者说不清楚间接光在代码中的体现。
下图是帮助理解的核心
关键部分就是间接光照 = 反射光照,这从根本上解释了间接光照的含义就是从其他位置处反射的光照,而非从光源上。
假定所有表面都不自发光,也就是Le(p,wi)=0,那么定义X位置处上的入射辐射度为Lx,直接光照部分记为Dx,间接光照/反射光照部分记为Rx,BRDF项记为frx
Lx====frX∗(DX+RX)frX∗(DX+frA∗(DA+RA))frX∗(DX+frA∗(DA+frB∗(DB+RB)))frX∗(DX+frA∗(DA+frB∗(DB+fri∗(...))))
也就是
Lo(p,wo)=∫2πfr(p,wi,wo)(Le(rc(p,wi,−wi)+Lr(rc(p,wi),−wi)))cosθidωi
这里Le项表示emitted radiance,因为其他表面没有自发光项,因此就是光源部分的辐射度贡献,即直接光照direct illumination部分;Lr项表示reflected radiance,也就是间接光照indirect ilumination。
根据无穷积分的定义,也可以改写为
Lo(p,wo)=+∫2πfr(p,wi,wo)Le(rc(p,wi,−wi)cosθidωi∫2πfr(p,wi,wo)Lr(rc(p,wi),−wi)∣∣p′−p∣∣2cosθicosθ′V(p,p′)dA
右边的V(p′,p)项就是shadowRay计算是否可视的结果
所谓的最简单的递归形式的Path Tracing本质上是对渲染方程的另一种解读,可以想象有以下光路
假定光路上任意点pi的BRDF(p)cosθi乘积定义为Qi,若光源上出射辐射度为Li
那么Lo(p,wo)=Li∗QD∗QC∗QB∗QA
回想伪代码实现
for i : spp
new ray()
Li += li(ray, scene) / spp
end
等价于
Lo(p,wi,wo)=++∗(Li∗QD∗QC∗QB∗QALi∗QE∗QC∗FB∗QGLi∗QH∗QI...)spp1
这一计算式本身就是∫2πfr(p,wi,wo)Li(p,wi)cosθidwi的蒙特卡洛近似实现了
结论
本身递归形式和增量循环形式的Path tracing本身都是一种渲染方程的实现方式,并无差错之分。但前者的问题在与光路击中光源的概率太低的时候,比如场景中只有点光源时那么结果会是一片黑。因此在实现效果上考虑了直接光采样的Path Tracing会更胜一筹。